package com.permissionx.gjx

import android.content.pm.PackageManager
import androidx.fragment.app.Fragment

// typealias关键字可以用于给任意类型指定一个别名
typealias PermissionCallback = (Boolean, List<String>) -> Unit

// 因为onRequestPermissionsResult回调方法需要，所以建立一个隐藏的Fragment来写，调用方就不用在自己的activity中重写这个方法了
class InvisibleFragment : Fragment() {

    /**
     * 是否全部允许，拒绝了的权限列表
     */
    private var callback: PermissionCallback? = null

    /**
     * 传入获取权限后的lambda，和需要的权限列表
     * @param cb Function2<Boolean, List<String>, Unit>
     * @param permissions Array<out String>
     */
    fun requestNow(cb: PermissionCallback, vararg permissions: String) {
        callback = cb
        requestPermissions(permissions, 1) // 立即申请运行时权限
    }


    /**
     * 处理运行时权限的申请结果
     * @param requestCode Int 请求的代码 自己指定的
     * @param permissions Array<String> 请求的列表
     * @param grantResults IntArray 每个请求同一和拒绝的情况
     */
    override fun onRequestPermissionsResult(requestCode: Int,
                                            permissions: Array<String>, grantResults: IntArray) {
        if (requestCode == 1) {

            // deniedList列表来记录所有被用户拒绝的权限
            val deniedList = ArrayList<String>()

            for ((index, result) in grantResults.withIndex()) {
                if (result != PackageManager.PERMISSION_GRANTED) {
                    deniedList.add(permissions[index])
                }
            }
            val allGranted = deniedList.isEmpty()

            // it()相当于调用callback函数了
            callback?.let { it(allGranted, deniedList) }
        }
    }
}